ALV Editierbar machen

Dieses kurze Programm zeigt, was nötig ist, um eine Tabelle in einem ALV-Grid editieren zu können. Der Name der Datenbanktabelle wird einmal festgelegt und das Programm erzeugt die entsprechenden Datentabelle und liest die Daten von der Datenbank. Das Eingabe bereite Grid wird angezeigt und kann editiert werden.

Das unten stehende Programm erzeugt selbstständig die Datenstrukturen für die Tabelle T005, liest die ersten zehn Datensätze von der Datenbank und zeigt sie in einem editierbaren ALV-Grid an.

Beim Verlassen der Anwendung werden die Daten als Liste ausgegeben.

HINWEIS:
Die Methode Handle_Data_Changed wird erst aufgerufen, nachdem die ENTER-Taste gedrückt wurde!!!
Sollen die Änderungen auch nach dem Druck einer Funktionstaste übernommen werden, so muss vorher die Methode CHECK_DATA_CHANGED aufgerufen werden! Es sei denn, Sie registrieren nicht den MC_EVT_ENTER sondern nehmen stattdessen den MC_EVT_MODIFIED… Dann erfolgt die Datenänderung sofort, nachdem das Feld verlassen wird.

Es erfolgt natürlich keine Änderung auf der Datenbank!


Die Tabelle T005 wird in einem ALV Grid geändert

 

 

 

 

 

 

 

 

Coding

*&---------------------------------------------------------------------*
*& Report  ZZ_ALV_EDIT
*&---------------------------------------------------------------------*

REPORT  zz_alv_edit LINE-SIZE 1000.

*** Variablen
DATA:
*** Pointer für CREATE DATA
  gref           TYPE REF TO data,
*** Name der Datenbanktabelle
  gv_sname       LIKE dd02l-tabname VALUE 'T005',
*** Feldkatalog
  gt_fcat        TYPE lvc_t_fcat.

*** Feld-Symbole
FIELD-SYMBOLS:
*** Feldkatalog
  <fcat>      TYPE lvc_s_fcat,
*** Feld der Struktur
  <feld>      TYPE ANY,
*** Arbeitsbereich der internen Tabelle
  <wa>        TYPE ANY,
*** Die interne Tabelle mit Struktur aus GV_SNAME
  <itab>      TYPE table.

*----------------------------------------------------------------------*
*       CLASS lcl_events DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_events DEFINITION.

  PUBLIC SECTION.
    METHODS:
      handle_data_changed
            FOR EVENT data_changed  OF  cl_gui_alv_grid
            IMPORTING er_data_changed sender.

ENDCLASS.                    "lcl_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_rohr_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_events IMPLEMENTATION.

  METHOD handle_data_changed.
******************************************
*** HandleDataChanged                  ***
******************************************
    DATA: ls_good                TYPE lvc_s_modi.

*** alle Inhalte der geänderten Zellen in die interne Tabelle schreiben
    LOOP AT er_data_changed->mt_good_cells INTO ls_good.
*** Dazu auf die richtige Zeile in der ITAB positionieren:
      READ TABLE <itab> ASSIGNING <wa> INDEX ls_good-row_id.
      IF sy-subrc = 0.
*** Und das geänderte Feld dem Feldsymbol zuweisen
        ASSIGN COMPONENT ls_good-fieldname OF STRUCTURE <wa> TO <feld>.
        IF sy-subrc = 0.
*** Feldwert zuweisen
          <feld> = ls_good-value.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                    "handle_data_changed

ENDCLASS.                    "lcl_events IMPLEMENTATION

*** Variablen ALV
DATA:
  ref_alv        TYPE REF TO cl_gui_alv_grid,
  ref_container  TYPE REF TO cl_gui_custom_container,
  ref_alv_events TYPE REF TO lcl_events.


*** Programmstart
START-OF-SELECTION.

*** Aufruf des Dynpros
  CALL SCREEN 4000.

*&---------------------------------------------------------------------*
*&      Form  init
*&---------------------------------------------------------------------*
FORM init.

*** Container erzeugen
  CHECK ref_alv IS INITIAL.
  CREATE OBJECT ref_container
         EXPORTING container_name = 'ALV'.

  TRY.
*** Erzeugung der Datenstrukturen zur Laufzeit
      CREATE DATA gref TYPE STANDARD TABLE OF (gv_sname).
      ASSIGN gref->* TO <itab>.

*** Einlesen der Daten
      SELECT * FROM (gv_sname)
        INTO TABLE <itab>
       UP TO 10 ROWS.

*** Fehler abfangen
    CATCH cx_sy_create_data_error.
      WRITE 'Wrong Database!'.
  ENDTRY.

*** Feldkatalog einlesen
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = gv_sname
    CHANGING
      ct_fieldcat      = gt_fcat
    EXCEPTIONS
      OTHERS           = 3.

*** Alle Felder editierbar machen
  LOOP AT gt_fcat ASSIGNING <fcat>.
    <fcat>-edit = 'X'.
  ENDLOOP.

*** ALV erzeugen
  PERFORM create_alv.

ENDFORM.                    "init

*&---------------------------------------------------------------------*
*&      Module  STATUS_4000  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_4000 OUTPUT.

*** Status
  SET TITLEBAR '4000'.
  SET PF-STATUS 'STLI' OF PROGRAM 'SAPMSSY0'.

*** Clear
  CLEAR sy-ucomm.

*** Init ALV
  PERFORM init.

ENDMODULE.                 " STATUS_4000  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_4000  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_4000 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR '%EX' OR 'RW'.
*** Liste
      LEAVE TO LIST-PROCESSING.
      SET PF-STATUS space.
*** Tabelleninhalt ausgeben
      LOOP AT <itab> ASSIGNING <wa>.
        NEW-LINE.
        DO.
          ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <feld>.
          IF sy-subrc = 0.
*** Ausgabe des Feldes
            WRITE: <feld>.
          ELSE.
            EXIT. "from DO-LOOP
          ENDIF.
        ENDDO.
      ENDLOOP.
*** Exit
      SET SCREEN 0. LEAVE SCREEN.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_4000  INPUT

*&---------------------------------------------------------------------*
*&      Form  create_alv
*&---------------------------------------------------------------------*
FORM create_alv .

*** ALV anbinden
  CREATE OBJECT ref_alv
        EXPORTING
          i_parent          = ref_container
          i_appl_events     = 'X'
        EXCEPTIONS
          OTHERS            = 5.

*** Edit-Event extra registrieren
  ref_alv->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_enter ).

*** Edit-Mode aktiv setzen
  ref_alv->set_ready_for_input( i_ready_for_input = 1 ).

*** ...und EventHandler zuweisen
  CREATE OBJECT ref_alv_events.
  SET HANDLER ref_alv_events->handle_data_changed FOR ref_alv.

*** First Display
  CALL METHOD ref_alv->set_table_for_first_display
    CHANGING
      it_fieldcatalog = gt_fcat
      it_outtab       = <itab>
    EXCEPTIONS
      OTHERS          = 4.

*** Fokus auf das Grid setzen
  cl_gui_alv_grid=>set_focus( ref_alv ).

*** Flush
  CALL METHOD cl_gui_cfw=>flush.

ENDFORM.                    " create_alv

Dynpro-Ablauflogik

PROCESS BEFORE OUTPUT.
MODULE STATUS_4000.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_4000.

HINWEIS:
Auf dem Dynpro muss ein “Custom Container” mit Namen “ALV” angelegt werden.

TIPP für Version ECC 5.0:
Wenn Sie in den Eigenschaften des Dynpros das Häkchen “Ohne Applikationsbar” setzen, dann wird die Zeile, in der normalerweise die Druckknöpfe stehen, ausgeblendet und es steht Ihnen mehr Platz für das ALV-Grid zur Verfügung!

Enno Wulff

Leave a Comment